package net.xuele.learn.zk;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;

import java.util.List;

/**
 * Created by huanghao（HIKARI） on 2019/6/11 0011.
 */
public class zkClient {
    public static void main(String[] args) {
        ZkClient zkClient = new ZkClient("127.0.0.1:2181")
                ;
        // 该方法存在递归（创建失败ZkNoNodeException，则先创建父节点，再创建子节点），并且创建出来的接地点，data为null
        // 临时节点不能再创建子节点，只能作为叶子节点
        zkClient.createPersistent("/zk/book",true);
        // 此操作会逐层遍历删除节点
        zkClient.deleteRecursive("/zk/book/zookeeper");
        List<String> children = zkClient.getChildren("/zk/book");// 返回结果形如：[c1,c2]
        // zkClient的API没有提供watcher注册的功能，其中引入的是Listene
        // r概念，客户端可以通过注册相关事件监听来实现
        // 对zk服务端事件的订阅
        zkClient.subscribeDataChanges("/zk/book", new IZkDataListener() {
            @Override
            public void handleDataChange(String dataPath, Object data) throws Exception {

            }

            @Override
            public void handleDataDeleted(String dataPath) throws Exception {

            }
        })  ;
        // 这个不是一次性的
        List<String> list = zkClient.subscribeChildChanges("/zk", new IZkChildListener() {
            // 处理子节点变动事件
            @Override
            public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {

            }
        });

        Object o = zkClient.readData("/zk/book/c1", true);
        zkClient.writeData("/zk/book/c1",new Object());
    }
}
